package 构建模式;


import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * 享元模式 如果n个地方需要用相同参数的对像，只使用一个对像，不重复new，减少内存的占用（new消耗内存）
 * 如果只有一个类，享元模式用不用意义不大
 * 比单例模式更加灵活，通过工厂可以获取多种结果，同时保存了单例的优点（节省内存）
 */
public class 享元模式 {
    public static void main(String[] args) {
       //只有第一个的时候创建
        TreeFactory.getTree("red","Xxxx");
        TreeFactory.getTree("red","Xxxx");
        TreeFactory.getTree("red","Xxxx");
    }
}
class TreeFactory{
    //ConcurrentMap是线程安全的,因为是静态，多个类就可以用同一个树库了
    static ConcurrentMap<String,Tree> map = new ConcurrentHashMap();
    //获得tree
    public static Tree getTree(String name, String data){
        if(!map.containsKey(name)){
            synchronized (TreeFactory.class) {
                if (!map.containsKey(name)) {
                    //通过线程安全能保存，此条语句只执行一次

                    map.put(name,new Tree(name,data));
                }
            }
        }
        return map.get(name);
    }
}
class Tree{
    //多个地方使用同一个对像，一般这个对像的数据就是不可变的
    private final String name;
    private final String date;

    public Tree(String name, String date) {
        this.name = name;
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public String getDate() {
        return date;
    }
}
